//
//  IMFCMPushService.h
//  DualMediationSDK
//
//  Created by YeJary on 2025/1/27.
//

#import <Foundation/Foundation.h>
#import <UserNotifications/UserNotifications.h>
#import "IMFCMPushModels.h"

// Forward declarations to avoid UIKit dependency
@class UIViewController;

// Define UIBackgroundFetchResult locally to avoid UIKit dependency


NS_ASSUME_NONNULL_BEGIN

/**
 * FCM消息推送服务
 * 
 * 功能说明：
 * - 初始化Firebase Cloud Messaging
 * - 处理推送通知接收和点击
 * - 管理FCM令牌
 * - 支持前台和后台通知处理
 * 
 * 使用注意：
 * - 需要在项目中集成Firebase SDK
 * - 需要添加google-services.plist文件
 * - 建议在SDK初始化回调之后调用
 * - 需要在AppDelegate中配置相关代理方法
 */
@interface IMFCMPushService : NSObject

/**
 * 获取共享实例
 * @return 服务实例
 */
+ (instancetype)sharedService;

/**
 * 检查FCM是否已初始化
 * @return YES表示已初始化，NO表示未初始化
 */
- (BOOL)isFCMInitialized;

/**
 * 初始化Firebase消息推送（基础版本）
 * @param completion 完成回调
 */
- (void)initializeFirebaseMessagingWithCompletion:(nullable IMFCMPushCompletionBlock)completion;

/**
 * 初始化Firebase消息推送（带目标页面）
 * @param targetViewControllerClass 点击通知时打开的页面类
 * @param completion 完成回调
 */
- (void)initializeFirebaseMessagingWithTargetViewController:(Class)targetViewControllerClass 
                                                 completion:(nullable IMFCMPushCompletionBlock)completion;

/**
 * 初始化Firebase消息推送（完整配置）
 * @param config 推送配置
 * @param completion 完成回调
 */
- (void)initializeFirebaseMessagingWithConfig:(IMFCMPushConfig *)config 
                                   completion:(nullable IMFCMPushCompletionBlock)completion;

/**
 * 获取当前FCM令牌
 * @return FCM令牌，未初始化返回nil
 */
- (nullable NSString *)getCurrentFCMToken;

/**
 * 异步获取FCM令牌
 * @param completion 完成回调
 */
- (void)getFCMTokenWithCompletion:(IMFCMPushCompletionBlock)completion;

/**
 * 请求通知权限
 * @param completion 完成回调
 */
- (void)requestNotificationPermissionWithCompletion:(void(^)(BOOL granted, NSError * _Nullable error))completion;

/**
 * 检查通知权限状态
 * @param completion 完成回调
 */
- (void)checkNotificationPermissionWithCompletion:(void(^)(UNAuthorizationStatus status))completion;

/**
 * 设置通知接收回调
 * @param callback 通知接收回调
 */
- (void)setNotificationReceivedCallback:(nullable IMFCMNotificationReceivedBlock)callback;

/**
 * 设置令牌刷新回调
 * @param callback 令牌刷新回调
 */
- (void)setTokenRefreshCallback:(nullable IMFCMTokenRefreshBlock)callback;

/**
 * 处理远程通知（在AppDelegate中调用）
 * @param userInfo 通知用户信息
 * @param completionHandler 完成处理器
 */
//- (void)handleRemoteNotification:(NSDictionary *)userInfo 
//               completionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;

/**
 * 处理通知点击（在AppDelegate中调用）
 * @param userInfo 通知用户信息
 */
- (void)handleNotificationTap:(NSDictionary *)userInfo;

/**
 * 处理通知点击（带视图控制器）
 * @param userInfo 通知用户信息
 * @param viewController 目标视图控制器
 */
- (void)handleNotificationTap:(NSDictionary *)userInfo viewController:(UIViewController *)viewController;

/**
 * 订阅主题
 * @param topic 主题名称
 * @param completion 完成回调
 */
- (void)subscribeToTopic:(NSString *)topic completion:(nullable void(^)(NSError * _Nullable error))completion;

/**
 * 取消订阅主题
 * @param topic 主题名称
 * @param completion 完成回调
 */
- (void)unsubscribeFromTopic:(NSString *)topic completion:(nullable void(^)(NSError * _Nullable error))completion;

/**
 * 设置用户属性（用于个性化推送）
 * @param value 属性值
 * @param key 属性键
 */
- (void)setUserProperty:(NSString *)value forKey:(NSString *)key;

/**
 * 启用/禁用自动初始化
 * @param enabled 是否启用
 */
- (void)setAutoInitEnabled:(BOOL)enabled;

/**
 * 检查是否为FCM通知
 * @param userInfo 通知用户信息
 * @return YES表示是FCM通知，NO表示不是
 */
- (BOOL)isFCMNotification:(NSDictionary *)userInfo;

@end

NS_ASSUME_NONNULL_END
